#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//函数的递归使用  //每一次递归都是函数的独立调用

//什么是递归：程序调用自身的编程技巧称为递归

//递归有两个必要条件  但不是充要条件
// 1.存在限制条件，当满足这个限制条件的时候，递归便不再继续
// 2.每次递归调用后越来越接近这个限制条件



//例题1：接受一个整型值（无符号），按照顺序打印他的每一位
//如：输入：1234 ，输出：1 2 3 4
//void print(int a)
//{
//	
//		if (a > 9)   //if防止无限递归进入死循环 创造一个限制条件        
//			//函数的递归本质是自己调用自己，先递推出去然后再返回来继续调用，然后再打印  //递推回归
//		{
//			print(a / 10);//   a/10 接近限制条件
//		}
//		printf("%d ", a%10);
//}
//int main()
//{
//	int a = 0;
//	scanf("%d", &a);
//	print(a);
//	return 0;
//}

//例题2：编写函数不允许创建临时变量，求字符串长度。


//函数方法1：
//int my_strlen(char* str)  //因为a的地址是个字符的地址 ，所以应该放入char的指针里面
//{                         //求长度的时候应该返回int型
//	int count = 0;//统计字符的个数  ---是一个临时变量---
//	while(*str != '\0')    //指针str 指向的字符为*str也就是a的位置 解引用
//	{                      //str是指向数组的一个地址不是内容，而*str是指向这个地址的内容
//		count++;
//		str++;
//	}
//	return count;
//}


//函数的方法2：
//用递归的方法  思想是：
//既然要用 my_strlen("abcdef") 求字符串长度
//*str可以找到a的地址 那么可以用递归的方法将其变成
//递归第一次 变成：1 + my_strlen("bcdef")
//递归第二次 变成：1 + 1 + my_strlen("cdef")
//递归第三次 变成：1 + 1 + 1 + my_strlen("def")			

//  ...
//递归到最后一次 变成：1 + 1 + 1 + 1 + 1 + 1 + 1 + my_strlen("")
//再一次变成：1 + 1 + 1 + 1 + 1 + 1 + 1 + 0;
 int my_strlen(char* str)  //char*的指针加一跳过的是一个字符
{                         
	if (*str != '\0')  //if防止无限递归进入死循环 创造一个限制条件
	{
		return 1 + my_strlen(str + 1);  // my_strlen(str + 1)  接近限制条件
	}
	else
	{
		return 0;
	}
}
int main()
{
	//正常简答的写为：
	//char arr[] = "abcdef";
	//int len = strlen(arr);//需要头文件 #include<string.h> //引入了库函数  //strlen用法解释是 寻找\0 找到\0就停止并输出\0前面的内容，不包括\0
	//printf("%d\n", len);
	//return 0;


	//用函数的方法来写为：
	char arr[] = "abcdefg";
	int len =my_strlen(arr); //数组传参，（）里面写的是数组名的时候，实际上传参传入的是数组里第一个元素的地址//本题即a的地址
	printf("%d\n", len);
	return 0;
}